package com.ly.gof.create.factory;

/**
 * @author liuyang
 * @des 凡是需要生成复杂对象的地方，都可以尝试考虑使用工厂模式来代替。
 * 复杂对象指的是类的构造函数参数过多等对类的构造有影响的情况，因为类的构造过于复杂，
 * 如果直接在其他业务类内使用，则两者的耦合过重，后续业务更改，就需要在任何引用该类的源代码内进行更改
 * <p>
 * 按实际业务场景划分，工厂模式有 3 种不同的实现方式，分别是简单工厂模式、工厂方法模式和抽象工厂模式。
 * 我们把被创建的对象称为“产品”，把创建产品的对象称为“工厂”。如果要创建的产品不多，只要一个工厂类就可以完成，这种模式叫“简单工厂模式”。
 * 在简单工厂模式中创建实例的方法通常为静态（static）方法，因此简单工厂模式（Simple Factory Pattern）又叫作静态工厂方法模式（Static Factory Method Pattern）。
 * 简单工厂模式每增加一个产品就要增加一个具体产品类和一个对应的具体工厂类，这增加了系统的复杂度，违背了“开闭原则”。
 * @Version 1.0
 * @Date: 21/07/2021 09:22
 */
public class Client {
    public static void main(String[] args) {

        Product product = SimpleFactory.makeProduct(Const.PRODUCT_A);
        product.show();
        Product product2 = SimpleFactory.makeProduct(Const.PRODUCT_B);
        product2.show();
    }

    //抽象产品（Product）：是简单工厂创建的所有对象的父类，负责描述所有实例共有的公共接口。
    public interface Product {
        void show();
    }

    //具体产品（ConcreteProduct）：是简单工厂模式的创建目标。：ProductA
    static class ConcreteProduct1 implements Product {
        public void show() {
            System.out.println("具体产品1显示...");
        }
    }

    //具体产品：ProductB
    static class ConcreteProduct2 implements Product {
        public void show() {
            System.out.println("具体产品2显示...");
        }
    }

    final class Const {
        static final int PRODUCT_A = 0;
        static final int PRODUCT_B = 1;
        static final int PRODUCT_C = 2;
    }

    //简单工厂（SimpleFactory）：是简单工厂模式的核心，负责实现创建所有实例的内部逻辑。工厂类的创建产品类的方法可以被外界直接调用，创建所需的产品对象。
    static class SimpleFactory {
        public static Product makeProduct(int kind) {
            switch (kind) {
                case Const.PRODUCT_A:
                    return new ConcreteProduct1();
                case Const.PRODUCT_B:
                    return new ConcreteProduct2();
            }
            return null;
        }
    }
}
